package com.itheima.canal.listener;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.itheima.canal.config.RabbitMQConfig;
import com.xpand.starter.canal.annotation.CanalEventListener;
import com.xpand.starter.canal.annotation.ListenPoint;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ZJ
 */
//这是一个cannal的监听类,是cannal在监听还是我们这个类在监听????我们这个类的作用是什么????
//这个类是为了监听canal的数据变化
// 是获取到cannal监听到数据然后处理这个数据吗??????这个是微服务的监听类
@CanalEventListener
public class SpuListener {

    //导入rabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    //定义canal中数据变化的类
    //这个注解的意思是监听goods数据库中的tb_spu表,最后一个参数是什么意思????,最后一个参数表示的是监听的类型是修改
    @ListenPoint(schema = "changgou_goods", table = {"tb_spu"}, eventType = CanalEntry.EventType.UPDATE)
    //第一个参数是数据类型,第二个参数是数据
    public void spuUp(CanalEntry.EntryType eventTyp, CanalEntry.RowData rowData) {
        System.out.println("tb_spu表中的数据发生了变化");


        //这个rowData的数据类型是什么样的,是一个json对象
        //修改前的数据
        Map oldMap = new HashMap<>();
        //遍历数据
        for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
            //colum是每一条数据
           //这个getname和getvalue分别表示什么意思
            oldMap.put(column.getName(),column.getValue());
        }

        //数据库修改后的数据
        Map newMap=new HashMap<>();
        //返回值是一个list集合,泛型是CanalEntry.Column
        List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
        //遍历
        for (CanalEntry.Column column : afterColumnsList) {
            newMap.put(column.getName(),column.getValue());
        }

        //判断is_markettable是1还是是0,1表示上架,判断数据is_markettable是否发生过改变
        if ("0".equals(oldMap.get("is_marktable")) && "1".equals(newMap.get("is_marktable"))){
            //表示数据发生了改变,这时候我们就需要把数据发送到rabbitMq中,发送的id是spu的id,map中有所有改变的数据,我们只需要spuid
            rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_UP_EXCHANGE,"",newMap.get("id"));
        }
    }
}

